Java 8 তে Optional একটি নতুন কনসেপ্ট হিসেবে প্রবর্তন করা হয়, যা null মান (null values) কে নিরাপদভাবে পরিচালনা করার জন্য ব্যবহৃত হয়। Functional Programming এর ধারণা অনুসরণ করে Optional ব্যবহার করা হয়, যা কোডের ক্লিনলিনেস এবং সেফটি বৃদ্ধি করে এবং null-সংশ্লিষ্ট ত্রুটিগুলি কমাতে সাহায্য করে।
Optional এর ধারণা:
Optional একটি container object যা হতে পারে:
- একটি মান (non-null value), অথবা
- null (অর্থাৎ, কোনও মান নেই)
Optional মূলত এমন একটি wrapper যা কোনো মান থাকতে পারে বা নাও থাকতে পারে, এবং এটি ফাংশনাল প্রোগ্রামিং প্যাটার্নে ব্যবহার করা হয় যেন কোডের মধ্যে null চেকের দরকার না হয়।
Optional এর সুবিধা:
- Null Safety:
Optionalক্লাসের মাধ্যমে null pointer exception (NPE) হ্যান্ডেল করা সহজ হয়। - Functional Approach:
Optionalএর মাধ্যমে আপনি functional style এর মতো কোড লিখতে পারেন, যেমনmap,filter,flatMapইত্যাদি। - Cleaner Code:
Optionalব্যবহার করলেnullচেকের জন্য প্রচুর if-else স্টেটমেন্টের প্রয়োজন হয় না, ফলে কোড পরিষ্কার হয়।
Optional ক্লাসের মূল মেথড:
Optional ক্লাসটি বিভিন্ন মেথড প্রদান করে যা আপনাকে মান (value) পরিচালনায় সাহায্য করে। কিছু গুরুত্বপূর্ণ মেথড হলো:
of(): একটি non-null মানের জন্যOptionalতৈরি করে।empty(): একটি emptyOptionalতৈরি করে (যেখানে মান নেই)।ofNullable(): একটি নাল বা non-null মানের জন্যOptionalতৈরি করে।get():Optionalথেকে মান প্রাপ্তি। কিন্তু, এটি যদি null হয় তবেNoSuchElementExceptionথ্রো করবে, তাই এর ব্যবহার ঝুঁকিপূর্ণ।isPresent(): যদিOptionalএর মধ্যে মান থাকে, তবেtrueফেরত দেয়।ifPresent(): যদিOptionalএর মধ্যে মান থাকে, তবে একটি কাজ (ইতিবাচক ক্রিয়া) চালায়।map():Optionalএর মধ্যে থাকা মানের উপর কোনো ফাংশন প্রয়োগ করতে ব্যবহৃত হয়।flatMap():Optionalএর মধ্যে থাকা মানকে ফাংশনাল অপারেশনে প্রক্রিয়া করতে ব্যবহৃত হয়।filter(): একটি শর্তের উপর ভিত্তি করেOptionalএর মান ফিল্টার করতে ব্যবহৃত হয়।
Optional এর সাথে Functional Programming এর ব্যবহার:
ফাংশনাল প্রোগ্রামিং প্যাটার্নে Optional ব্যবহৃত হয় null চেকের পরিবর্তে ফাংশনাল অপারেশন করতে, যেমন map(), filter(), এবং flatMap()।
1. map() মেথড:
map() মেথডটি Optional এর মধ্যে থাকা মানের উপর একটি ফাংশন প্রয়োগ করে একটি নতুন Optional প্রদান করে। এটি শুধুমাত্র তখনই ফাংশনটি প্রয়োগ করে যখন Optional এর মধ্যে মান থাকে।
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Optional<String> name = Optional.of("Alice");
// map() to convert value
Optional<String> upperCaseName = name.map(String::toUpperCase);
upperCaseName.ifPresent(System.out::println); // Output: ALICE
}
}
এখানে, map() মেথড ব্যবহার করে Optional এর মধ্যে থাকা স্ট্রিংটি uppercase এ পরিবর্তন করা হয়েছে।
2. filter() মেথড:
filter() মেথডটি Optional এর মধ্যে থাকা মানকে একটি শর্তের ভিত্তিতে ফিল্টার করতে ব্যবহৃত হয়। এটি যখন শর্ত পূর্ণ হয় তখন একটি নতুন Optional ফেরত দেয়, অন্যথায় একটি খালি Optional ফেরত দেয়।
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Optional<Integer> number = Optional.of(10);
// filter() to check condition
Optional<Integer> filteredNumber = number.filter(n -> n > 5);
filteredNumber.ifPresent(System.out::println); // Output: 10
}
}
এখানে, filter() মেথড ব্যবহার করে আমরা সংখ্যাটিকে ৫ এর বেশি কিনা তা চেক করেছি। যদি সংখ্যাটি ৫ এর বেশি হয়, তাহলে সেটি প্রক্রিয়াকরণ হবে, অন্যথায় এটি খালি Optional হবে।
3. flatMap() মেথড:
flatMap() মেথডটি একটি ফাংশন প্রাপ্ত Optional কে মানে রূপান্তরিত করে এবং তা একটি নতুন Optional প্রদান করে। এটি Optional গুলি চেইন করার জন্য ব্যবহৃত হয়।
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Optional<String> name = Optional.of("Alice");
// flatMap() to apply transformation and return Optional
Optional<String> result = name.flatMap(n -> Optional.of(n.toLowerCase()));
result.ifPresent(System.out::println); // Output: alice
}
}
এখানে, flatMap() ব্যবহার করে আমরা Optional এর মধ্যে থাকা মানকে ছোট হাতের অক্ষরে রূপান্তরিত করেছি এবং একটি নতুন Optional তৈরি করেছি।
4. ifPresent() মেথড:
ifPresent() মেথডটি Optional এর মধ্যে মান থাকা অবস্থায় একটি অ্যাকশন (যেমন, লম্বা লজিক বা আউটপুট) চালায়। এটি মূলত side effect তৈরি করার জন্য ব্যবহৃত হয়।
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Optional<String> name = Optional.of("Alice");
// ifPresent() to perform action if value is present
name.ifPresent(n -> System.out.println("Name is: " + n)); // Output: Name is: Alice
}
}
এখানে, ifPresent() ব্যবহৃত হচ্ছে যদি Optional এর মধ্যে কোনো মান থাকে, তবে একটি লজিক কার্যকরী করা হবে।
Optional এর সাথে Null Safety:
Null Safety নিশ্চিত করার জন্য Optional ব্যবহার করা হয়, যাতে কোডের মধ্যে NullPointerException কমানো যায়। Optional এর মাধ্যমে আপনি null চেক করতে পারেন এবং প্রয়োজনে কোনো ডিফল্ট মান প্রদান করতে পারেন।
import java.util.Optional;
public class OptionalExample {
public static void main(String[] args) {
Optional<String> name = Optional.ofNullable(null);
// orElse() to provide default value if value is not present
String result = name.orElse("Unknown");
System.out.println(result); // Output: Unknown
}
}
এখানে, orElse() মেথড ব্যবহার করে আমরা null মানের জন্য একটি ডিফল্ট মান (এখানে "Unknown") প্রদান করেছি।
Optional এর অন্যান্য মেথড:
isPresent(): যদিOptionalএর মধ্যে মান থাকে, তবেtrueফেরত দেয়।orElseGet(): এটি orElse() এর মতো, তবে এখানে ডিফল্ট মানটি একটি supplier function হতে পারে।orElseThrow(): এটিOptionalএর মধ্যে মান না থাকলে একটি এক্সেপশন ফেলে।
Optional<String> name = Optional.ofNullable(null);
// Throws an exception if no value is present
String result = name.orElseThrow(() -> new IllegalArgumentException("Name is required"));
সারাংশ:
Optional ক্লাস Java 8 এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা null চেকের জন্য নিরাপদ এবং কার্যকরী পদ্ধতি সরবরাহ করে। এটি ফাংশনাল প্রোগ্রামিং ধারণার মধ্যে ব্যবহৃত হয় যেখানে map, flatMap, filter, ifPresent, এবং orElse ইত্যাদি অপারেশনগুলি ব্যবহার করা হয়। Optional ব্যবহারের মাধ্যমে আপনি কোডের মধ্যে null pointer exception (NPE) থেকে বাঁচতে পারেন এবং একটি সুনির্দিষ্ট, পরিষ্কার এবং নিরাপদ কোড তৈরি করতে পারেন।
Read more